perm filename S1OLD[F8,ALS] blob sn#321385 filedate 1977-12-10 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00009 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	*CHECKERS as of October 20 1977.  EQU's
C00008 00003	  ORG  H'1000'  Initial operations and questions
C00017 00004	  ORG  H'1100'  PMOV  Player's move
C00026 00005	  ORG  H'1200'  WMC RKB BLKM REDM
C00034 00006	  ORG  H'1300'  BORD
C00044 00007	*-*-*- SEDC TABL CURS BYDT MVC AMD BLNK
C00060 00008	*-*-*- INIT TYO UDIT TAB1 TAB2 KING REDP BLKP POIN YMF SKL
C00068 00009	  ORG  H'1680'  INHR ENIN DAI SCRD
C00075 ENDMK
C⊗;
*CHECKERS as of October 20 1977.  EQU's
* S1 section
*Resident package addresses
JOYT    EQU     H'0C00'
LINE    EQU     H'0FDF'
SHCB    EQU     H'0FE2'
INPF    EQU     H'0FE3'
WTLN    EQU     H'0FE5'
TXC     EQU     H'0FE8'
CMRG    EQU     H'0FEA'
DBNC    EQU     H'0FEB'
UPI     EQU     H'0FFA'
JOYI    EQU     H'21AD'
IJS     EQU     H'22DB'
SHL     EQU     H'27C6'
SHR     EQU     H'27D3'
PUSH    EQU     H'40A9'
POPS    EQU     H'40BC'
SPS     EQU     H'40D0'
WDG     EQU     H'4105'
WAUD    EQU     H'41C8'
WAU1    EQU     H'41CC'
CDS     EQU     H'41D5'
WMS     EQU     H'4205'
UDAT    EQU     H'424D'
TRAN    EQU     H'43CD'
FCS     EQU     H'43D6'
WAIT    EQU     H'4501'
TIR     EQU     H'45DB'
CLER    EQU     H'4762'
*Misc. constants
TCMD    EQU     H'44'
BCMD    EQU     H'6D'
TCOL    EQU     H'80'   TEXT COLOR
ULIN    EQU     H'F5'
COM     EQU     H'8F7'
*RAM assignments
BFLG	EQU	H'0C20'		Button edge flag
BLNF	EQU	H'0C21'		Blink flag
XBLN	EQU	H'0C22'		X value to blink
YBLN	EQU	H'0C23'		Y value to blink
BCNT	EQU	H'0C24'		Counter used in OKMV
BKMV	EQU	H'0C25'		Data to index book moves
HSAV	EQU	H'0C26'		H save location
PLY0    EQU     H'0C28'        Place for player's ply depth choice
COL0    EQU     H'0C29'        Place for color choice(next after PLY0)
SELX    EQU     H'0C2A'        SELE exit
XOLD    EQU     H'0C2D		X coord touch point
YOLD    EQU     H'0C2E'         Y coord touch point
XBLN    EQU     H'0C29'        X value to blink
YBLN    EQU     H'0C2A'        Y value to blink
OBJ0    EQU     H'0C30'        Board 1, thru H'0E0F'
TREE    EQU     H'0E10'        Tree data, thru H'0EFF', Player's board first
TRE2    EQU     H'0E20'        Machine's first board here
TRE3    EQU     H'0E30'        PLY 1 LOCATION
PLMD    EQU     H'0E5B'        Used for temp store of player's move inf
PLMV    EQU     H'0ED0'        Overlay region used for player's moves
PLMF    EQU     H'0EE0'           and move numbers
SCOR	EQU	H'0EF0'		SCORE (HI:LO) 14 byte pairs
XPOS    EQU     H'0F0C'        XPOSITION(CURSOR)
YPOS    EQU     H'0F0F'        YPOSITION(CURSOR)
OBJ1    EQU     H'0F10'        Board 2, thru H'0FAF'
MOBS    EQU     H'0FB0'         Mobility (14 bytes)
RGSV	EQU	H'0FC1'		Register save start (int. update)
*Scratch pad assignments
TEMP   EQU     H'8'
J      EQU     H'9'
HU     EQU     H'A'
HL     EQU     H'B'
PLOC   EQU     O'3'            LISU value for ACTIVE and PASSIVE
KLOC   EQU     O'4'            LISU value for KING's and special data
ELOC   EQU     O'5'            LISU value for EMPTY's area
ISA    EQU     O'30'           ISAR value for active area
ISP    EQU     O'34'           ISAR value for passive
ISK    EQU     O'40'           ISAR value for kings
ISE    EQU     O'51'           ISAR value foempty (with offset)
*Mimimum ply depths
PLYT   EQU     H'E9'           Playing depth for Tom (neg mob sum)
PLYD   EQU     H'E1'           Playing depth for Dick
PLYH   EQU     H'D9'           Playing depth for Harry
*SPECIAL CONSTANTS
MSK     EQU     H'1'          X ZOOM bit mask (cmrg)
X       EQU     H'1'
Y       EQU     H'2'
VX      EQU     H'3'
VY      EQU     H'4'
CHT     EQU     H'3'    CURSOR HEIGHT
YTST    EQU     H'9'
XZOP    EQU     H'34'   Line for restore of X zoom
MAXY    EQU     H'4D'   MAX Y COORD (=H'4F'-CHT)
*Linkage locations
SEL2    EQU     H'1800'
  ORG  H'1000'  Initial operations and questions
       DC      H'AA'
       DC      H'55'
       DC      H'00'   BACKGROUND COLOR
       DC      H'00'   BACKGROUND COLOR
       DC      H'00'   SPACES
       DC      H'00'   SPACES
       DC      H'3119' CH
       DC      H'0B31' EC
       DC      H'150B' KE
       DC      H'0921' RS
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
*-*-
       PI      CDS     CLEAR DISPLAY
       PI      IJS     INITIALIZE JOYSTICK TABLE
        LISU    2      For safety only, can be removed later
        LISL    6
        CLR
        XS      S
        BM      QN1     Is clock running?
        LI      H'81'   No, so start it
        LR      D,A
        LIS     2
        LR      S,A
*-*-*-*- Initial question session
QN1    LIS     H'4'
       LR      0,A
       PI      SEDC    SET MESSAGE LNGTH&LINE POINTER
       DS      1
       DS      1       SET DEFAULT PLY DEPTH
       DCI     SKL
       PI      WMS     WRITE MESSAGE
       PI      RKB     AND DO KEYBOARD READ
       CI      H'1F'
       BZ      QN10    IS IT 'DICK'?
       CI      H'19'   NO.
       BNZ     QN11    IF NOT 'HARRY', THEN 'TOM'
       DS      1
QN10   DS      1
QN11   DCI     PLY0
       LR      A,1     GET CORRECT PLY DEPTH
       ST              AND SAVE IT.
       DS      0
       DS      0       SET FOR BUT TWO LINES
       PI      CDS     CLEAR DISPLAY
       PI      SEDC    SET LINE POINTER
       LI      H'FA'
       AS      S
       LR      S,A     SET FOR BUT H'1A' LENGTH
       DCI     YMF     DCO TO MESSAGE START
       PI      WMS     SO WRITE MESSAGE
       PI      RKB     READ KEYBOARD
       CI      H'2B'   Is answer an N?
     DCI      COL0
     CLR
     LR       7,A     Black plays first always
     BZ       QN13    N means machine first
     COM
     ST               COL0←-1, player is black
     COM
     ST               SELX←0 always
     BR       QN14
QN13 ST               COL0←0, machine is black
     ST               SELX←0 always
QN14 DCI      BLKM    Table of possible moves
        XDC
        DCI     PLMV    List to verify moves
        LIS     H'7'
        LISU    2
        LISL    0
        LR      S,A             SET TRANSFER COUNT
        PI      TRAN            DO TRANSFER
        DCI     BKMV
        CLR
        ST                Clear Book move index value
       DCI     CMRG
       LI      H'65'
       ST              SET FOR X & Y ZOOM
        PI      CLER    TURN OFF CURRENT OBJECTS
        PI      SURP    SET UM1 REGS AND POINTERS
        PI      ENIN
*-*-*- Load SC for initial board
        LISU    PLOC            LOAD SCRATCHPAD AS
        LISL    7               FOLLOWS:
        CLR
BRDJ    LR      D,A             O'30'=FF
        BR7     BRDJ            O'31'=F0
        COM                     O'32'=0
        LR      I,A             O'33'=0
        LR      I,A             O'34'=0
        SL      4               O'35'=0
        LR      I,A             O'36'=F
        LISL    6               O'37'=FF
        LIS     H'F'
        LR      I,A
        LISU    KLOC
        LISL    H'7'
        CLR
BRDK    LR      D,A             O'40' thru O'47' = 0
        BR7     BRDK
        LISL    6               Except
        LI     H'80'            O'46' to contain H'80'
        LR      S,A
        DCI     TRE2
        PI      SCRD            SR to RAM for machine's first move
        DCI     TREE
        PI      SCRD            SR to RAM for player's first move
        PI      BORD    Generate board image with men
        DCI     XPOS
        LIS     H'0'
        ST                      SET FOR LEFT MOST
        LI      H'3'
        ST
        LIS     H'0'
        ST
        DCI     YPOS
        LIS     H'0'
        ST                      AND SET FOR TOPMOST
*-*-*-*-*-*-*-*-*-*- Start play
        DCI     COL0
        CLR
        XM
        BM      PMOV            Player chose Black
*-*-*- Machine's first move if playing black
        LISU    2
        LISL    5
        LR      A,S             Used as random number
        NI      H'7'            Save last 3 bits
        LR      0,A             Use this number to select move
        DCI     BKMV            Book move index
        SL      4               Save space for second move
        SR      1
        ST                      Record first move
        DCI     PLMV
QN17    LM                      Get byte record
        LR      1,A
QN18    LR      A,1
        NS      1
        BNZ     QN19            Is this byte exhausted?
        LM                      Step over byte info
        BR      QN17            Go to next byte record
QN19    LR      2,A
        AI      H'FF'           Subtract 1
        NS      1
        LR      1,A             byte less rightmost bit
        XS      2               This leaves 1 bit in A
        DS      0
        BP      QN18
        LR      6,A             Save the byte bit
        LM                      Get the byte info
        LR      4,A             The byte indicator
        DCI     TRE2            Machine's board is here
        LR      H,DC
        LIS     H'C'
        ADC
        LR      A,6
        ST
        LR      A,4
        ST
        JMP     SEL2            Go to SELE to make move
  ORG  H'1100'  PMOV  Player's move
PMOV    PI      MVC             Initiate cursor
        DCI     TREE            Player's board is here
        LR      H,DC
MES0    CLR                     "YOUR MOVE"
MES1    LR      0,A             Identify message
        PI      WMC             Write message
        DCI     BLNF
        CLR
        ST
        LR      DC,H
CUR1    PI      CURS            Initiate cursor
*-*- Now X in 1, Y in 2, byte in 3 and byte # in 4
OKPI    DCI    PLMV            Possible moves listing
OKP1    LM                      Get move byte
        NI      H'FF'
        BNZ     OKP3            An entry found
        LR      A,5             Byte info
        NI      H'10'           Extract J bit
        LIS     H'5'            "PIECE CAN'T MOVE"
        BZ      OKP2
        LIS     H'1'            "MUST JUMP"
OKP2    BR      MES1            Try again
OKP3    NS      3               Compare
        BNZ     OKP4            This might be the one
        LM                      A cheap way to index
        LR      5,A             Save for jump info
        BR      OKP1            Try again
OKP4    LM                      Next entry is the byte info
        LR      5,A             Save it
        SR      1
        SR      1
        NI      H'3'           Remove the J bit and the direction
        XS      4               Does it match?
        BNZ     OKP1            Try again
        DCI     PLMD            Save data as to starting square
        LR      A,1             X
        ST
        LR      A,2             Y
        ST
        LR      A,3             Byte
        ST
        LR      A,4             Byte info
        ST
        LI      -H'4'
        DCI     BCNT            Counter
        ST
        DCI     BLNF            Blink flag
        LIS     H'1'            Set on
        ST
        LR      A,1             Save X value
        ST                      in XBLN
        LR      A,2             Save Y value
        ST                      in YBLN
CUR2    PI       CURS            USE  CTMP TO DEBUG
        DCI     PLMD+2          Restore initial values
        LM
        LR      3,A             for BYTE
        LM
        LR      4,A             and BYTE number
*Now test indicated move for legality
OKMV    DCI     PLMD            Saved data location
        LM                      Get the old X value
        COM
        INC
        AS      1               This gives us the change in X
        BZ      NON2            Illegal
        LR      1,A             Save the difference
        BP      OKM1
        COM
        INC
OKM1    LR      0,A             |∂X|
        CI      H'2'
        BM      NON3            Too far
        CLR                     Anticipate normal move
        BNZ     OKM2
        LI      H'10'           Set Jump bit
OKM2    LR      6,A             save byte info here
        LM                      Get the old Y value
        COM
        INC
        AS      2
        LR      2,A             Change in Y
        BM      OKM3
        COM
        INC
OKM3    AS      0
        BNZ     NON2            |∂X|≠|∂Y|
        LR      A,2
        NS      2
        BP      OKM4
        LIS     H'2'            Backward bit
        AS      6
        LR      6,A
OKM4    LR      A,1
        NS      1
        BM      OKM5            
        LIS     H'1'            Left bit
        AS      6
        LR      6,A
OKM5    LR      A,4             Get initial Byte #
        SL      1               Shift it left to position
        SL      1
        AS      6               Add in the J and Direction bits
        LR      6,A            Final byte info from cursor
        DCI    PLMV            Possible moves listing
        LIS     H'8'            7 moves possible
        LR      0,A
OKM6    CLR
        XM
        BZ      NONO            No more entries
        LR      1,A
        LM
        LR      5,A             Save byte info
OKM7    CLR
        XS      1
        BZ      OKM6            Last bit tested
        LR      2,A             We'll need it again
        AI      H'FF'           Subtract 1
        NS      1
        LR      1,A             Byte with bit removed
        XS      2               Get extracted bit
        DS      0               Count tries
        NS      3               Does it check with 3
        BZ      OKM7            Not in table entry, try again
        LR      A,5             But does byte info agree?
        XS      6               Compare 6 with table value
        BNZ     OKM7            No so count remaining bits in 1
        LIS     H'7'            Found, so reorder count
        XS      0               order from 0 thru 6
        DCI     BKMV
*       LR      Q,DC		3 inst. to go in with 3rd book move fix
*       OM                      Save info in left half, if any
*       LR      DC,Q
        ST                      Save move count for book move entry
        DCI     TREE            Store final values
        LR      H,DC
        LIS     H'C'
        ADC
        LR      A,3
        ST                      Store byte
        LR      A,6
        ST                      And byte info
        PI      MVC             Turn off cursor
        JMP     SEL2
NONO    LR      A,5
        NI      H'10'           A jump required?
        LIS     H'2'
        BZ      NON4
        LIS     H'1'
        BR      NON4
NON2    LIS     H'2'
        BR      NON4
NON3    LIS     H'3'
NON4    LR      0,A
        DCI     BCNT
        LM
        INC
        DCI     BCNT
        ST
        BM      NON5
        JMP     MES0
NON5    PI      WMC
        JMP     CUR2
  ORG  H'1200'  WMC RKB BLKM REDM
*-*-*- Message writing, uses R0, 1, SC O'24'
* calls UPDATE routine. Message # in 0.
WMC     LR      K,P     SAVE RETURN ADDRESS
        PI      PUSH    PUSH ONTO STACK
        PI      DAI     DISABLE INTERRUPTS
        DCI     H'872'
        LI      H'82'
        ST
        DCI     HSAV
        LR      A,HU
        ST
        LR      A,HL
        ST
        PI      MWAD    WAIT, THEN UPDATE
        DCI     WMCA    DCO TO MESSAGE ADDRESS START
        LR      A,0     GET MESSAGE NUMBER
        SL      1
        AS      0
        ADC             ADD 3XNUMBER TO DCO
        LISU    2
        LISL    4       SET ISAR TO O'24'
        LM
        LR      S,A     SET MESSAGE LENGTH
        LM
        LR      QU,A
        LM
        LR      QL,A    MESSAGE ADDRESS INTO Q
        DCI     LINE
        LI      H'50'
        ST              SET PROPER LINE NUMBER
        DCI     H'0E5F' DCO TO MESSAGE BUILD AREA
        LI      H'70'
        LR      1,A     SET COUNTER
        CLR             CLEAR ACC
WMC1    ST
        DS      1
        BNZ     WMC1    CLEAR TEXT AREA
        PI      MWAD    WAIT, THEN DO UPDATE
        DCI     H'872'
        LIS     H'2'
        ST              TURN OBJECT ON
        LR      DC,Q    SET ADDRESS INTO DCO
        PI      WMS     WRITE MESSAGE
        PI      MWAD    WAIT, THEN UPDATE
      LR    A,0       Get message #
      CI    H'5'
      BP    WMC2      Does not require #
      LR    A,HL
      SR    4
      LR    TEMP,A
      PI    WDG       Write single digit
WMC2  PI    MWAD
      DCI   HSAV
      LM
      LR    HU,A
      LM
      LR    HL,A
        PI      ENIN    ENABLE INTERRUPTS ONCE MORE
        PI      POPS    POP RETURN ADDRESS
        PK              AND RETURN
*-*-*-*-*-*-*-*-*-*
* DATA FOR WMC
*
WMCA    DC      H'A'    YOUR MOVE!      0
        DC      YRMV:       
        DC      YRMV.
        DC      H'A'    MUST JUMP       1
        DC      MJM:
        DC      MJM.
        DC      H'D'    ILLEGAL MOVE    2
        DC      MIM:
        DC      MIM.
        DC      H'8'    TOO FAR         3
        DC      TFM:
        DC      TFM.
        DC      H'7'   MY MOVE             4
         DC     MYMV:
         DC     MYMV.
        DC      H'10'   PIECE CANNOT MOVE  5
        DC      PCMM:
        DC      PCMM.
       DC      H'5'     SELE             6
       DC      SELM:
       DC      SELM.
       DC      H'5'     SELY             7
       DC      SELY:
       DC      SELY.
       DC      H'5'     FIND             8
       DC      FINM:
       DC      FINM.
YRMV    DC      H'0513' YOur move
        DC      H'0309' UR
        DC      H'0'    SPACE
        DC      H'2913' MO
        DC      H'2F0B' VE
        DC      H'04'   !
MJM     DC      H'290B' MUst jump
        DC      H'2107' ST
        DC      H'0'    SPACE
        DC      H'1703' JU
        DC      H'2925' MP
        DC      H'04'   !
MIM     DC      H'0127' ILlegal move
        DC      H'270B' LE
        DC      H'1B11' GA
        DC      H'2700' L SPACE
        DC      H'2913' MO
        DC      H'2F0B' VE
        DC      H'04'   !
TFM     DC      H'0713' TO far
        DC      H'1300' O SPACE
        DC      H'1D11' FA
        DC      H'0904' R!
MYMV    DC      H'2905' MY move
         DC     H'0'     -
        DC      H'2913' MO
        DC      H'2F0B' VE
PCMM    DC      H'2501' PIece can't move
        DC      H'0B31' EC
        DC      H'0B00' E SPACE
        DC      H'3111' CA
        DC      H'2B39' N'
        DC      H'0700' T SPACE
        DC      H'2913' MO
        DC      H'2F0B' VE
SELM    DC      H'210B'  SEle
       DC      H'270B'  LE
       DC      H'0'     -
SELY    DC      H'210B'  SEly
       DC      H'2705'  LY
       DC      H'0'     -
FINM   DC      H'1D01'   FInd
       DC      H'2B1F'   ND
       DC       H'0'     -
*-*-*- Read keyboard
RKB    LR      K,P              Read keyboard
       PI      PUSH
       LISU    2
       LISL    4       SET ISAR FOR DELAY TIMER
       LIS     H'0'
       LR      S,A     SET FOR MAX DELAY
RKB1   PI      FCS     FETCH CHARACTER
       BZ      RKB1    NULL INPUT?
       BM      RKB1    NO. DEBOUNCED INPUT?
       PI      POPS    YES. POP RETURN ADDRESS
       LR      A,8     GET KEYBOARD INPUT
       PK              AND RETURN
*-*-*- Initial moves for black
BLKM   DC      B'11110000'      4 pieces
       DC      B'00000100'      Byte 1, RF
       DC      B'11100000'      3 pieces
       DC      B'00000101'      Byte 1, LF
       DC      B'01000000'      11-15 repeat to give
       DC      B'00000100'      a slight preference
       DC      H'00'
*-*-*- Initial moves for red
REDM   DC      B'00000111'      3 pieces
       DC      B'00001010'      Byte 2, RB
       DC      B'00001111'      4 pieces
       DC      B'00001011'      Byte 2, LB
       DC      H'00'
  ORG  H'1300'  BORD
*-*-*-  Generate board image
BORD   LR      K,P
       LI      H'FF'
       LR      3,A     REG3=FF
       DCI     OBJ0    BRD1 START ADDRESS
       LIS     H'2'    FLAG FOR BOR
       LR      4,A     SET REG 4 = 2
       LIS     H'6'
BRD4   LR      0,A     REG0 = 6 ROWS
BRD3   LIS     H'A'
       LR      1,A     REG 1 = 10 LINE/ROW
BRD2   LIS     H'4'
       LR      2,A     REG2=SQ PAIRS/ROW
BRD1   LR      A,3
       ST              STORE IN BRD
       COM
       ST              NEXT IS COMPL. OF FIRST
       DS      2
       BNZ     BRD1    MORE FOR THIS ROW
       DS      1       NO, ALL LINE DONE
       BNZ     BRD2
       LR      A,3     DONE A TIMES YET
       COM
       LR      3,A
       DS      0       DEC ROW COUNT
       BNZ     BRD3    ALL ROWS DONE?
       DS      4
       BZ      BRD5    BOTH OBJECTS DONE?
       DCI     OBJ1    NO,GET BORD2 ADDRS.
       LIS     H'2'
       BR      BRD4    REG0=2
*-*-*-  Now put pieces in image
BRD5    LISU    3               Pieces are here
        LIS     H'1'            1 for red pieces (stored first)
        LR      4,A             Piece, (1 Red, 0 Black, -1 King)
        DCI     COL0
        CLR                     CLEAR ACC
        XM                      IN W/STATUS
        LR      0,A
        LISL    O'7'            Decrement and shift right
        BNZ      MEN1            if COL0 is FF (BLACK at bottom of screen)
        LISL    O'0'            Increment and shift left
MEN1    LIS     H'3'             if COL0 is 0 (Black at top of screen)
        LR      1,A             To count bytes
        NOP
        NOP
        NOP
        NOP
MEN2    LIS     H'7'
        LR      2,A             To count bits
        DCI     TAB1            Byte location table
        LR      A,1             This byte number
        SL      1               Locations occupy 2 bytes each
        ADC                     
        LM                      Get the byte location
        LR      QU,A            and save it in Q
        LM
        LR      QL,A
        LR      A,0
        NS      0
        BNZ     MEN5            Decrement and shift right if COL0 is FF
        LR      A,I             Increment and shift left if COL0 is 0
        NOP
        NOP
        NOP
        NOP
        BR      MEN4
MEN3    LR      A,3
        SL      1               and shift left
MEN4    LR      3,A
        NI      H'80'           (done this way for symry
        BZ      MEN9
        BR      MEN8
MEN5    LR      A,D             Decrement if COL0 is FF
        NOP
        NOP
        NOP
        NOP
        BR      MEN7
MEN6    LR      A,3
        SR      1               and shift right
MEN7    LR      3,A
        NI      H'1'
        BZ      MEN9
MEN8    DCI     TAB2            Relative-locations-of-squares table
        LR      A,2             This square
        ADC
        LM                      Get square displacement
        LR      DC,Q            Recall the location for the input byte
        ADC                     This is the square position
        LR      A,4             Identify type of piece
        NS      4
        BM      PUTK            To put down a king
        LIS     H'4'            Prepare for a piece
        LR      5,A             To count lines
        LI      H'20'           Skip the rst 4 lines (4*8)
        ADC
        XDC
        DCI     BLKP            Anticipate a black piece
        BZ      PUTL            A black piece (status bit still ok)
        DCI     REDP            No, it's a red piece
        BR      PUTL
PUTK    LIS     H'2'            Only 3 lines for a crown
        LR      5,A
        LIS     H'8'            To skip 1 line
        ADC
        XDC
        DCI     KING
PUTL    LM                      Put loop
        XDC
        ST
        LIS     H'7'            To next line on screen (less increment)
        ADC
        XDC
        DS      5
        BP      PUTL            Loop
MEN9    DS      2
        BM      ME10
        LR      A,0
        NS      0
        BNZ     MEN6            Shift right if COL0 is FF
        BR      MEN3            Shift left if COL0 is 0
ME10    DS      1
        BP      MEN2
        LR      A,4
        NS      4
        BM      BDEX            Exit from board routine
        DS      4
        BP      MEN1            Go round again for black pieces
        LISU    H'4'            Get set for kings
        LR      A,0
        NS      0
        LISL    H'3'            Decrementing case
        BNZ     MEN1            Dedrement and shift right if COL0 is FF
        LISL    H'0'            Incrementing case
        BR      MEN1            Increment and shift left if COL0 is 0
BDEX    PK
*-*-*-*-*-*-*-*-*-*-*-*-*-*    
*      SURP SETS UM1 REGS & PTRS
*
SURP    LR      K,P             SAVE RETURN ADDRESS
        PI      PUSH            AND PUSH IT ONTO STACK
        PI      CLER            CLER UM1 REGISTERS
        DCI     UPI             DCO TO UPDATE CONTROLS
        LIS     H'3'
        ST                      SET INTO COUNT
        CLR
        ST                      SET FOR FULL INIT
        LI      INIT:
        ST
        LI      INIT.
        ST                      AND SET ADDRESS
        PI      MWAD            WAIT, THEN UPDATE
        LIS     H'5'
        LR      S,A             GET TRANSFER COUNT
        DCI     BDAT            SET SOURCE
        XDC                     INTO DC1
        DCI     UPI+1           DESTINATION
        PI      TRAN            TRANSFER DATA
        JMP     WAU1            WAIT, DO UPDATE, RESET ISAR&RET.
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
*       UPDATE CONTROL DATA     *
*
BDAT    DC      H'1'            FLAG SET SHORT UPDATE
        DC      UDIT:
        DC      UDIT.
        DC      UDIT:
        DC      UDIT.
*-*-*- SEDC TABL CURS BYDT MVC AMD BLNK
* Set message length and line pointer
SEDC   DCI     LINE    DCO TO LINE POINTER
       LIS      H'2'
       SL     4        SET FOR SECOND LINE
       ST
       LR     A,0
       SL     4
       LISL   4
       LR     S,A      AND SET MESSAGE LENGTH
       CLR             CLEAR ACC
       LR     1,A      AND SET DEFAULT RESULT
       POP             N RETURN
*-*-*- Address table for MVC*
TABL   DC      H'0C30'
       DC      H'0C80'
       DC      H'0CD0'
       DC      H'0D20'
       DC      H'0D70'
       DC      H'0DC0'
       DC      H'0F10'
       DC      H'0F60'
*-*-*- To move cursor, uses 
*SC0,1,2,3,4,HU,Q,K,W, SC20-24.
CURS   LR     K,P      SAVE RETURN ADDRESS
       PI     PUSH     AND PUSH IT ON TO STACK
       PI     DAI      DISABLE INTERRUPT DRIVEN UPDATE
MAP0   PI     MWAD     WAIT, THEN UPDATE
       LIS    H'1'     YES, CAN START JOYREAD
       LR     HU,A     SET FOR HORIZONTAL POT
       PI     JOYI     AND READ
       LR     VX,A     SAVE RESULT IN VX
       LIS    H'0'
       LR     HU,A     SET FOR VERTICAL POT
       PI     JOYI
       LR     0,A      SAVE IN REG 0
       PI     AMAP     CONVERT TO PROPER VELOCITY
       LR     VY,A     SAVE RESULT
       LR     A,VX
       LR     0,A    NOW GET UNCOVERTED VX INTO R0
       PI     AMAP     CONVERT IT
       LR     VX,A     AND SAVE IT
       PI     MWAD     WAIT, THEN UPDATE
       PI     BLNK      To blink code (on)
       LIS    H'4'
       LR     0,A
MP01   PI     MWAD
       DS     0
       BNZ    MP01
       PI     BLNK      To blink code (off)
       CLR             CLEAR ACC
       XS     VX       VX IN W/STATUS
       BZ     MAP7     NON-NULL X COMPONENT?
       DCI    XPOS     YES
       LM
       LR     X,A      SET CURRENT X POSITION
       LISU   2
       LISL   0
       CLR
       LR     I,A      SP20<=0
       LM
       LR     I,A      SP21<=NON NULL LEAD MASK
       LM
       LR     S,A      SP22<=TRAILING MASK
       CLR
       XS     VX       VX IN W/STATUS
       BM     MAP3     GOING LEFT?
       PI     SHR      SHIFT RIGHT ONE
       LIS    H'7'     NO, GOING RIGHT.
       XS     X
       BNZ    MAP5     IN RH MOST BOX?
       LISL   2        YES
       XS   S
       BZ     MAP5     TRIED TO GO TOO FAR?
MAP2   CLR             YES.
       LR     VX,A     CLEAR X VELOCITY
       BR     MAP7     AND CHECK Y
MAP3   PI     SHL      SHIFT LEFT ONE
       CLR
       XS     X
       BNZ    MAP4     IN LH MOST BOX?
       LISL   0        YES
       XS     S
       BNZ    MAP2     TRIED TO GO TOO FAR?
MAP4   LISL   0
       CLR
       XS     S
       BZ     MAP7     IS SP20 NULL?
       LISL   1        NO.
       LR     A,I
       LR     S,A
       LISL   0
       LR     A,I
       LR     D,A
       CLR
       LR     S,A      SP22<=SP21,SP21<=SP20,SP20<=0,THAT ORDER
       DS     X        AND DECREMENT X COUNT
       BR     MAP7     NOW GO CHECK Y
MAP5   LISL   1
       CLR             CLEAR ACC
       XS     S
       BNZ    MAP7     IS SP21=0?
       LISL   2
       LR     A,D
       LR     I,A
       CLR
       LR     D,A      SP21<=SP22,SP22<=0, THAT ORDER
       LIS    H'1'
       AS     X
       LR     X,A      INCREMENT X COUNT
MAP7   CLR
       XS     VY
       BZ     MAP9     VY=0?
       DCI    YPOS     NO, SET DCO TO LAST Y POSITION
       AM              UPDATE Y COORD
       BM     MP7A    Result Y is neg?
       CI     MAXY     COMPARE W/MAX ALLOWED Y
       BC     MAP8     NEW Y>MAX ALLOWED VALUE?
MP7A   CLR             YES
       LR     VY,A     RESET VY
       BR     MAP9
MAP8   LR     Y,A      SET NEW Y
MAP9   LR     A,VY     GET VY
       SL     1
       XS     VX
       BZ     MP12     ANY MOVEMENT?
       PI     MVC      YES, REMOVE OLD POSITION
       CLR
       XS     VY
       BZ     MP10     ANY Y MOVEMENT?IF NOT, MUST HAVE VX NE 0
       DCI    YPOS
       LR     A,Y      IS, SO RESET
       ST              Y POSITION
       CLR
       XS     VX
       BZ     MP11     ANY X MOVEMENT?
MP10   DCI    XPOS     UPDATE X POSIT & MASK
       LR     A,X
       ST
       LISL   1
       LR     A,I
       ST
       LR     A,S
       ST
MP11   PI     MVC      DISPLAY NEW POSITION
MP12   CLR
       OUTS   1        Clear port 1
       NOP             3 NOP's for FCC
       NOP             Do not remove
       NOP             for any reason
       INS    1        Get buttons
       NI     H'1'     Strip to desired one
       DCI    BFLG    To button flag
       CLR
       BNZ    MP13    Any button input?
       ST             No, reset edge flag
MP14   JMP    MAP0    And go try again
MP13   LR     Q,DC    Save address
       XM             Flag in W/STATUS
       BNZ    MP14    Previous input?
       LIS    H'1'    No, reset flag
       LR     DC,Q    Recover address
       ST             And reset
CON    CLR  
        LR      0,A     Set counter (Y conversion)
CON1    LR      A,Y     Get Y coordinate
        CI      YTST    Compare W/test value
        BC      CON2    Y LE test value?
        LR      A,0     No, increment counter
        INC
        LR      0,A
        LI      -H'A'
        AS      Y
        LR      Y,A     Y←Y-H'A'
        BR      CON1    Go back and try agian
CON2    LR      A,0     Get counter
        LR      Y,A     Y now  (0-7):(top-bottom)
        AS      X
        NI      H'1'
        BZ      MP14    On a legal square?
        DCI     COL0    Yes
        CLR
        XM              Flag in W/STATUS
        BP      CON3    Machine plays RED?
        LIS     H'7'    Yes
        XS      Y
        LR      Y,A     Y←7-Y
        LIS     H'7'
        XS      X
        LR      X,A     X←7-X
CON3    LR      A,Y
        SR      1
        LR      VY,A    VY reg (BYTENO)←(1/2*(7-Y)
        DCI     BYDT    To BYTE data
        LR      A,X     Get X coord.
        ADC             Add offset to base address
        LM              Get byte
        LR      VX,A    Save byte into VX reg
        NOP
       NOP
       NOP
       NOP
       PI     MWAD    WAIT, THEN UPDATE
       PI     ENIN    ENABLE INTERRUPT DRIVEN UPDATE
       PI     POPS    POP RETURN ADDRESS
       PK             AND RETURN
*-*-*- Data for byte values (X coord. conversions)
BYDT    DC      H'0880'
        DC      H'0440'
        DC      H'0220'
        DC      H'0110'
*-*-*- MVC Set or remove cursor
MVC    LR     K,P     SAVE RETURN ADDRESS
       DCI    XPOS
       LM
       LR     0,A     SAVE X IN R0
       LISU   2
       LISL   3
       LM
       LR     I,A
       LM
       LR     D,A     LEAD IN SP23,TRAIL IN SP24
      CI    YPOS
       LM             GET Y COORDINATE
       DCI    H'0C30' DCO TO OBJ0 BASE ADDRESS
       ADC            ADD 8 X Y COORD (W/MAX FOR Y
       ADC            OVER H'40', CANNOT USE "CUTE"
       ADC            TRICKS HERE--AND FOR SPEED,
       ADC            WE JUST USE STRAIGHT ADC'S).
       ADC
       ADC
       ADC
       ADC
       LR     A,0     GET X OFFSET
       ADC            AND ADD IT IN
       LIS    CHT
       LR     0,A    SET COUNT FOR TRANSFER
MVC1   LR     Q,DC    SAVE ADDRESS IN Q REG
       LR     A,QU    GET HO ADDRESS
       CI     H'E'
       BNZ    MVC2    AT BOTTOM OF OBJ0
       LR     A,QL    DEFINITELY.
       CI     H'F'
       BC     MVC2    PAST BOTTOM?
       LIS    H'F'    YES.
       LR     QU,A    RESET HO ADDRESS
       LR     DC,Q    AND RESET DCO ACCORDINGLY (FOR OBJ1)
MVC2   LR     A,I     GET LEAD MASK BYTE
       LR     Q,DC    SAVE DCO
       XM             XOR IN CURSOR
       LR     DC,Q    RECOVER ADDRESS
       ST             AND RESET THAT BYTE
       LR     Q,DC    SAVE ADDRESS AGAIN
       LR     A,D     GET TRAILING MASK BYTE
       XM             XOR IN BITS
       LR     DC,Q    RECOVER ADDRESS
       ST             AND RESET DATA
       LIS    H'6'
       ADC            SET TO NEXT DESTINATION
       DS     0      DECREMENT COUNTER
       BNZ    MVC1    DONE?
       PK             YES, RETURN
*-*-*- AMAP Mapping joystick readings to velocities
AMAP   LR   A,0     GET READING
       CI   H'2'
       BNC  AMP1    VAL LE H'1'?
       LI   H'FF'   YES.
       BR   AMP2
AMP1   CI   H'C6'
       CLR
       BC   AMP2    VAL GT 197?
       LIS  H'1'    YES, VELOCITY = 1
AMP2   POP          RETURN
*-*-*- BLNK  Blinking routine
BLNK   LR       K,P
        DCI     BLNF    Test BLINK flag
        CLR
        XM
        BZ      BLN4    Need to blink?
        LISU    2
        LISL    3
        LM              Yes
        LR      I,A     Get X value
        LM
        LR      D,A     and Y value to blink
        DCI     COL0
        CLR
        XM
        BZ      BLN0    Need to reverse?
        LIS     H'7'
        XS      S
        LR      I,A
        LIS     H'7'
        XS      S
        LR      D,A
BLN0    DCI     H'0C30'-H'50'    DC0 TO OBJ0-H'50'
        LISL    4
        LIS     H'5'
        SL      4
BLN1    ADC                      Add off-set
        DS      S
        BP      BLN1            Added enough?
        LR      Q,DC            Yes
        LR      A,QU            Get H0 address
        CI      H'E'
        BNZ     BLN2            Need reset?
        LIS     H'F'            Yes
        LR      QU,A
BLN2    LR      DC,Q
        LISL    3
        LR      A,S
        ADC                     Add off-set
        LIS     H'3'
        LR      0,A             Set counter
BLN3    LR      Q,DC
        LI      H'C0'
        XM
        LR      DC,Q
        ST
        LIS     H'7'
        ADC                     Next one to blink
        DS      0               Decrement counter
        BNZ     BLN3            Done?
BLN4    PK
*-*-*- INIT TYO UDIT TAB1 TAB2 KING REDP BLKP POIN YMF SKL
INIT   DC      H'30'   OBJ0 L.O.RP
       DC      H'10'   OBJ1 L.O. RP
        DC      H'5F'   TEXT LOW ORDER ROM
       DC      H'8C'   OBJ0 H.O.RP+COLOR
       DC      H'8F'   OBJ1    H.O.RP
        DC      H'EE'   
       DC      H'48'   OBJ0 DELTA X ---
       DC      H'48'   OBJ1 DELTA X---
       DC      H'70'   TEXT OBJECT DELTA X
TY0   DC      H'3C'   OBJ0 DELTA Y ----
       DC      H'14'  OBJ1 DELTA Y ---
       DC      H'07'  TEXT OBJECT DELTA Y
       DC      H'0D'   OBJ0-X-CO
       DC      H'0D'   OBJ1 X-CO
       DC      H'0D'   TEXT OBJECT X COORD
       DC      H'48'   OBJ0 Y-VALUE L.O.A
       DC      H'C0'   OBJ1 Y-VALUE L.O.A
       DC      H'26'   TEXT OBJECT Y VAL LO A
       DC      H'00'   OBJ0 Y-VALUE H.0 &X-ORDER
       DC      H'01'   OBJ1- Y-VAL H.O.$X-ORDER
       DC      H'82'   TEXT OBJ INITIALLY OFF
UDIT   DC      H'30'
       DC      H'10'
       DC      H'5F'
       DC      H'8C'
       DC      H'8F'
       DC      H'EE'
        DC      H'3C'
        DC      H'14'
        DC      H'07'
TAB1   DC      H'0F10' BYTE 3
       DC      H'0D70' BYTE 2
       DC      H'0CD0' BYTE 1
       DC      H'0C30' BYTE 0
TAB2   DC    D'86'   RELATIVE SQUARE POSITION TABLE
       DC      D'84'
       DC      D'82'
       DC      D'80'
       DC      D'07'
       DC      D'05'
       DC      D'03'
       DC      D'01'
KING   DC      B'01011010'     KING'S CROWN
       DC      B'00111100'
       DC      B'00011000'
REDP   DC      B'00111100'     RED PIECE
       DC      B'01111110'
       DC      B'01111110'
       DC      B'01111110'
       DC      B'00111100'
BLKP   DC      B'00111100'     BLACK PIECE
       DC      B'01000010'
       DC      B'01000010'
       DC      B'01000010'
       DC      B'00111100'
POIN   DC      B'00001100'
       DC      B'00000110'
       DC      B'00000011'
       DC      B'00000001'
*-*-*- YMF
YMF    DC      H'0513' Y0ur move
       DC      H'0300' U-
       DC      H'2913' MO
       DC      H'2F0B' VE
       DC      H'00'   -
       DC      H'1D'   F
       DC      H'0109' IR
       DC      H'2107' ST
       DC      H'00'   -
       DC      H'35'   ?
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'0500' Y-
       DC      H'1309' OR
       DC      H'00'   -
       DC      H'2B'   N
*-*-*-*-*-*-*-*-*-*-*-*-*-
*-*-*- SKL Skill text
SKL    DC      H'3119' CHoose    key
       DC      H'1313' OO
       DC      H'210B' SE
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'150B' KE
       DC      H'0500' Y-
       DC      H'00'   -
       DC      H'00'   -
       DC      H'0713' TOm
       DC      H'2900' M-
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'07'   T
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
DICK   DC      H'1F01' DIck
       DC      H'3115' CK
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'1F'   D
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
HARY   DC      H'1911' HArry
       DC      H'0909' RR
       DC      H'0500' Y-
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'19'   H
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
       DC      H'00'   -
*-*-*-*- MAUD WAIT, THEMN UPDATE, ANND KEEP THE
* XZOOM BIT SET PROPERLY DURING DISPLAY MAINTENANCE
MWAD    LR      K,P
        PI      PUSH
        PI      WAIT
        DCI     CMRG    DCO TO RPOG COPY COMREG
        LI      MSK     MASK IN
        XM              TURN OFF ZOOM
        DCI     H'8F7'  IN THE UM1 COPY
        ST              ONLY
        PI      UDAT    NOW DO UPDATE
        LI      XZOP    SET LINE FOR RESTORE ZOOM
MWD1    DCI     H'8FB'  DCO TO CURRENT LINE
        CM              COMPARE
        BNZ     MWD1    REACHED IT YET?
        DCI     CMRG    YES
        LM
        DCI     H'8F7'  NOW RESET UM1 COPY
        ST
        PI      POPS    POP RETURN ADDRESS
        PK              AND RETURN
  ORG  H'1680'  INHR ENIN DAI SCRD
*-*-INHR Interrupt handler, saves and restores data
INHR   LR      8,A     SAVE ACC
       LR      A,IS
       LISU    O'6'
       LISL    O'0'
       LR      I,A     SAVE A IN REG24
       LR      A,QU
       LR      I,A     SAVE QU IN REG25
       LR      A,QL
       LR      I,A     SAVE QL IN REG26
       LR      A,J
       LR      I,A     SAV IN REG27
       XDC
       LR      Q,DC    GET DC
       DCI     H'0FB0' GET FREE RAM ADDR.
       LR      A,QU    SAVE ORIGINAL DC1
       ST
       LR      A,QL
       ST
       XDC
       LR      Q,DC
       XDC
       LR      A,KU
       ST
       LR      A,KL
       ST              SAVE KL
       LR      A,HU    UPPER H
       ST              SAVE IT
       LR      A,HL
       ST              SAVE H
       LR      J,W
       LR      A,J
       ST              SAVE W
       LR      K,P
       LR      A,KU
       ST              SAVE PCU
       LR      A,KL
       ST              SAVE PCL
       LR      A,QU    SAVE DC0 ORIGINAL
       ST
       LR      A,QL
       ST
        DCI     CMRG
        LI      MSK
        XM
        DCI     H'8F7'
        ST
       PI      UDAT    UPTE DISPLAY
        LI      XZOP
INH1    DCI     H'8FB'
        CM
        BNZ     INH1
        DCI     CMRG
        LM
        DCI     H'8F7'
        ST
*
*   RESTORE ALL REGISTERS
*
       DCI     H'0FB0'
       LM
       LR      QU,A    GET DC1
       LM
       LR      QL,A
       XDC
       LR      DC,Q    RESTORE DC1
       XDC
       LIS     H'2'
       ADC             BYPASS 'K' SAVED AREA
       LM              GET HU
       LR      HU,A    RESTORE HU
       LM
       LR      HL,A    RESTORE HL
       LM              GET W
       LR      J,A
       LR      W,J     RESTORE IT
       LM              GET PC1 HO
       LR      KU,A
       LM
       LR      KL,A
       LR      P,K     RESTORE PC1
       LM
       LR      QU,A
       LM
       LR      QL,A
       DCI     H'FB2'        PT TO K
       LM              GET KU
       LR      KU,A
       LM
       LR      KL,A    RESTORE K
       LR      DC,Q    RESTORE DC0
*
*   NOW RESTORE J,Q,A FROM SCRATCH PAD
*
       LISU    O'6'
       LISL    O'3'
       LR      A,D     GET J
       LR      J,A
       LR      A,D   GET QL
       LR      QL,A
       LR      A,D
       LR      QU,A    RESTORE QU
       LR      A,D     GET ISAR
       LR      IS,A    RESTORE ISAR
       LR      A,8     RESTORE A
       EI              INT. ENABLE
       POP
*-*-*- Interrupt enable for update
ENIN   LI      INHR:
       OUTS    H'C'
       LI      INHR.
       OUTS    H'D'    SET INTERRUPT VECTOR
       DCI     H'8F0'
       LI      ULIN
       ST              SET INTERRUPT LINE
       DCI     CMRG    DCO TO PROG COPY COMREG
       LR      Q,DC    SAVE ADDRESS IN Q RES
       LIS     H'8'
       OM
       LR      DC,Q
       ST              IN PROGRAM COPY
       DCI     H'8F7'
       ST              DITTO UM1 COPY
       LIS     H'1'
       OUTS    H'E'    ENABLE SMI...
       EI              ENABLE CPU
       LR      J,W     SAVE SAME STATUS
       POP             AND RETURN
*-*-*- Interrupt disable
DAI    DI              DISABLE CPU INTERRUPT
       LR      J,W     SET J ACCORDINGLY
       DCI     CMRG    DCO TO PROG COPY COMREG
       LR      Q,DC    SAVE ADDRESS
       LIS     H'8'
       COM
       NM              TURN OFF BIT
       LR      DC,Q    IN THE
       ST              PROGRAM COPY,
       DCI     H'8F7'
       ST              AND THE UM1 COPY
       CLR
       OUTS    H'E'    NOW DISABLE SMI
       POP             AND RETURN
*-*-*- SCRD  SC to RAM direct
SCRD    LR      K,P             SC TO RAM direct
        PI      PUSH
        LISU    PLOC
        LISL    0
        LIS     H'8'
        LR      0,A
        PI      SCRL
        LISU    KLOC
        LISL    0
        LIS     H'8'
        LR      0,A
        PI      SCRL
        PI      POPS
        PK
SCRL    LR      K,P             Used by SCRA and SCRD
SCR3    LR      A,I
        ST
        DS      0
        BNZ     SCR3
        PK
    END